home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / dev / sun4.md / iopb.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  13KB  |  491 lines

  1. /*
  2.  * Interface definitions for the Array
  3.  *
  4.  * $Header: /cdrom/src/kernel/Cvsroot/kernel/dev/sun4.md/iopb.h,v 9.1 92/08/24 14:34:02 alc Exp $
  5.  */
  6.  
  7. #ifndef _IOPB
  8. #define _IOPB
  9.  
  10. struct iopb {
  11.     char    command;    /* basic operation to be performed */
  12.     char    option;        /* modifies 'command' in some cases */
  13.     char    priority;
  14.     char    reserved1;      /* unused */
  15.     char    flags;
  16. #define            CHECKSUM2    0x01    /* 2-byte checksums */
  17. #define            CHECKSUM4    0x02    /* 4-byte checksums */
  18. #define            RESTARTED_IOPB    0x04    /* from dead controller */
  19. #define            WAIT_FOR_EVENT    0x08    /* applies to some cmds */
  20.  
  21.     u_int   log_array:2;      /* the logical array number */
  22.     u_int   reserved2:6;    /* currently unused */
  23.  
  24.     u_short    id;        /* logical volume, redundancy group, */
  25.                 /* logical disk, or controller/scsi_id */
  26.                 /* depending on the command */
  27.  
  28.     u_long    logical_block;    /* block to be read/written */
  29.     u_long    byte_count;    /* # of bytes to be transferred */
  30.     char    *buffer;    /* points to data (or scatter/gather list) */
  31.     char    buf_addr_mod;    /* address modifier for buffer */
  32.  
  33.     char    intr_level;    /* 0 => no int. (if possible) */
  34.     char    intr_vector;
  35.  
  36.     char    auxbuf_mod;    /* address modifier for the auxiliary buffer */
  37.     u_short    sg_entries;    /* # of normal scatter/gather entries */
  38.     u_short    auxbuf_size;    /* size of the buffer area */
  39.     char    *aux_buffer;    /* auxiliary buf: checksums, pass-thru, etc */
  40. };
  41.  
  42. /* The following macro forms an 'id' value from a controller and scsi id */
  43. #define    DISK_ID(ctrlr, scsi_id)    (((ctrlr) << 8) | ((scsi_id) & 0xff))
  44.  
  45. /*
  46.  * IOPB command and option values
  47.  */
  48. #define    CMD_READ    0    /* read blocks from a logical volume */
  49. #define    CMD_WRITE    1    /* write blocks to a logical volume */
  50. #define    CMD_INIT_GROUP    2    /* initialize a redundancy group */
  51. #define    CMD_READ_ENV    3    /* read the environment registers */
  52. #define    CMD_WRITE_ENV    4    /* write the environment registers */
  53.  
  54. #define    CMD_READ_CONF    5    /* read the system configuration */
  55. #define    CMD_WRITE_CONF    6    /* write the system configuration */
  56.         /* options for read/write configuration commands */
  57. #define        OPT_SYSTEM_INFO    0    /* system hardware information */
  58. #define         OPT_DEVICE_INFO 1       /* device information */
  59. #define        OPT_SYSVARS    2    /* system variables */
  60. #define        OPT_DISK_CONFIG    3    /* layout of disks in the array */
  61. #define         OPT_ADD_DISKS   4       /* add disks to the config */
  62. #define        OPT_SW_LOAD1    5    /* primary software load area */
  63. #define        OPT_SW_LOAD2    6    /* secondary sw load area */
  64. #define         OPT_SW_DIAG     7       /* diagnostic sw load area */
  65. #define        OPT_SCRATCHPAD    8    /* host scratchpad area */
  66.  
  67. #define    CMD_PASS_THRU    7    /* CDB pass-through command */
  68.  
  69. #define    CMD_READ_STATS    8    /* read performance stats */
  70. #define        OPT_NO_CLEAR    0    /* don't clear the stats structure */
  71. #define        OPT_CLEAR    1    /* clear the stats after reading */
  72.  
  73. #define    CMD_READ_ELOG    9    /* read an error log entry */
  74. #define        OPT_DESTRUCT    0    /* destructive read (inc. read ptr.) */
  75. #define        OPT_NONDESTRUCT    1    /* non-destructive read */
  76.  
  77. #define    CMD_SET_LEVEL    11    /* set the Array's run level */
  78. #define        OPT_BOOT_PROF    0    /* boot production code */
  79. #define        OPT_BOOT_DIAG    1    /* boot diagnostic code */
  80. #define        OPT_FINISH_BOOT    2    /* begin normal Array operation */
  81. #define         OPT_IDLE        3       /* idle array for config changes */
  82. #define        OPT_HALT        4       /* halt the Array */
  83. #define        OPT_REBOOT    5    /* reboot the Array */
  84.  
  85. #define    CMD_DIAGNOSTICS    12    /* run a diagnostic test */
  86. #define        OPT_LB_BUFFER    0    /* data loopback buffer test */
  87. #define        OPT_LB_CHANNEL    1    /* data loopback channel test */
  88. #define        OPT_LB_DRIVE    2    /* data loopback drive test */
  89. #define        OPT_SURFACE_TST    3    /* drive surface analysis test */
  90. #define        OPT_HOST_INTFCE    4    /* host interface test */
  91. #define        OPT_P_PARITY    5    /* P-parity test */
  92. #define        OPT_RD_REVISION    6    /* read revision */
  93.  
  94. #define CMD_VERIFY_GROUP 14    /* verify a redundancy group */
  95. #define    CMD_ACTIVATE_SP    15    /* activate a spare drive */
  96. #define    CMD_INSTALL_DRV    16    /* install a new drive */
  97.  
  98. #define CMD_GET_TIME 18         /* read the TOD clock */
  99. #define CMD_SET_TIME 19         /* set the TOD clock */
  100.  
  101. /*
  102.  * Pointed to by 'buffer' if sg_entries is non-zero.
  103.  */
  104. struct sg {
  105.     char    *buffer;
  106.     u_long    buf_addr_mod:8,
  107.         byte_count:24;
  108. };
  109.  
  110. /*
  111.  * Pointed to by aux_buffer if the command is CMD_PASS_THRU
  112.  */
  113. struct pass_thru_block {
  114.     u_long    timeout_value;    /* timeout (in sec.) for this command */
  115.     u_short reserved;
  116.     char direction;    /* data direction for this command */
  117. #define            PASS_THRU_NO_DATA    0
  118. #define            PASS_THRU_READ        1
  119. #define            PASS_THRU_WRITE        2
  120.     char cdb_len;           /* length of following CDB */
  121.     char    cdb[12];    /* contains the SCSI CDB */
  122. };
  123.  
  124.  
  125. /*
  126.  * The following defines relate to the operation of the FIFO.
  127.  */
  128. #define    MAX_IOPBS    127    /* maximum number of IOPBs that may be used */
  129. #define    FIFO_VALID    0x800    /* set if valid data was read from the FIFO */
  130. #define    IOPB_ERROR    0x080    /* set on a normal reply to indicate an error */
  131. #define    INDEX_MASK    0x7f    /* mask for the bits that form the index part */
  132.  
  133. /*
  134.  * if an IOPB fails due to DMA problems, DMA_ERROR is sent through the
  135.  * FIFO followed by one of the next two error codes and the index of
  136.  * the IOPB that failed.
  137.  */
  138. #define    DMA_ERROR    0x7f    /* pass through FIFO if array can't DMA */
  139. #define        IOPB_STATUS_ERR    1    /* couldn't return the status */
  140.  
  141.  
  142. /*
  143.  * The following structures are used when setting up the initial
  144.  * communication between the host and the array.
  145.  */
  146.  
  147. /*
  148.  * The IOPB table is an array of these...
  149.  */
  150. struct iopb_table {
  151.     struct iopb     *iopb_ptr;
  152.     char        iopb_addr_mod;
  153.     char        fill[3];
  154. };
  155.  
  156. /*
  157.  * The Status table is an array of these...
  158.  */
  159. struct status_table {
  160.     struct status     *status_ptr;
  161.     char        status_addr_mod;
  162.     char        fill[3];
  163. };
  164.  
  165. /*
  166.  * Status entries are pointed to by the entries in the status table. The
  167.  * status structures pointed to correspond to the IOPBs of the same number.
  168.  */
  169. struct status {
  170.     u_long    status;            /* primary error code */
  171.     u_long    status2;        /* optional additional information */
  172.     char    scsi_status;        /* SCSI completion status */
  173.     char    fill1, fill2, fill3;
  174.     char    request_sense[32];    /* SCSI request sense data */
  175. };
  176.  
  177.  
  178. /*
  179.  * This structure gets pushed through the FIFO when the system boots
  180.  * so that IOPBs can be passed around using only their index. It tells
  181.  * the Array where to find IOPBs and status blocks in host memory, and
  182.  * gives the Array information about how DMA should be performed.
  183.  */
  184. #define    TABLE_HEADER    0x7f    /* send this value ahead of the table desc. */
  185.  
  186. struct table_desc {
  187.  
  188.     struct iopb_table    *iopb_list;    /* ptr to iopb table array */
  189.     struct status_table    *status_list;    /* ptr to status block array */
  190.  
  191.     char        iopb_list_mod;        /* address mod. for above */
  192.     char        status_list_mod;
  193.     char        num_iopbs;        /* # of entries for both */
  194.     char        flags;                  /* currently unused */
  195.  
  196.     u_short        rdma_burst_sz;        /* DMA burst size for reads */
  197.     u_short        wdma_burst_sz;        /* DMA burst size for writes */
  198.     u_short        vme_timeout;        /* Bus timeout (in ms) */
  199.     u_short        reserved;
  200. };
  201.  
  202.  
  203. /*
  204.  * The remainder of this file contains data structures used in various
  205.  * IOPB commands.
  206.  */
  207.  
  208. /*
  209.  * CMD_READ_ENV
  210.  * CMD_WRITE_ENV
  211.  */
  212.  
  213. #if 0
  214. struct environ_regs {
  215.     /*
  216.      * Currently undefined
  217.      */
  218. };
  219. #endif
  220.  
  221.  
  222. /*
  223.  * CMD_READ_CONF
  224.  * CMD_WRITE_CONF
  225.  */
  226.  
  227. /*
  228.  *    OPT_SYSTEM_INFO
  229.  */
  230.  
  231. #define    DEV_PER_CHAN    8    /* possible drives per channel */
  232. #define    NUM_CHAN        12    /* total # of channels available */
  233.  
  234. typedef struct {
  235.     struct {
  236.         struct {
  237.             u_long    present;
  238.  
  239.             struct {
  240.                 u_long    present;
  241.                 u_long    device_type;
  242.                 u_long    num_blocks;
  243.                 u_long    block_size;
  244.             } dev[DEV_PER_CHAN];
  245.         } chan[NUM_CHAN];
  246.     } scsi_info;
  247.  
  248.     struct {
  249.         u_long    mem_size;
  250.         u_long    icache_size;
  251.         u_long    dcache_size;
  252.         u_long    hw_type;
  253.         u_long    controller_id;
  254.         u_long    system_sn;
  255.         u_long    controller_sn;
  256.     } hw_info;
  257. } SYSTEM_INFO;
  258.  
  259.  
  260. /*
  261.  *    OPT_DEVICE_INFO
  262.  */
  263.  
  264. typedef struct {
  265.  
  266.     u_long    type;
  267.     char    sn[16];
  268.  
  269.     u_long    state;
  270. } DEVICE_INFO[NUM_CHAN][DEV_PER_CHAN];
  271.  
  272.  
  273. /*
  274.  *    OPT_SYSVARS
  275.  */
  276.  
  277.  
  278. /*
  279.  *    OPT_DISK_CONFIG
  280.  */
  281.  
  282. #define    MAX_LOG_DISKS    409    /* maximum number of logical disks allowed */
  283.  
  284. struct logical_disk {
  285.     u_short    controller;    /* SCSI controller number */
  286.     u_short    scsi_id;    /* scsi drive id on the controller */
  287.     u_long    block_offset;    /* where the logical_disk starts */
  288.     u_long    num_blocks;    /* size of the logical_disk */
  289.     u_long    block_size;    /* block size for this drive */
  290.  
  291.     u_short    type;
  292. #define        DISK    0    /* configured disk */
  293. #define        COLD_SPARE    2
  294. #define        WARM_SPARE    3
  295. #define        BROKEN    4    /* drive has been replaced by a spare */
  296.  
  297.     u_short    status;
  298. #define        ONLINE    0
  299. #define        OFFLINE    1
  300. #define        REBUILDING    2
  301. };
  302.  
  303. /*
  304.  * The redundancy group array is a list of values with the following format:
  305.  *
  306.  *    flags        flags for this redundancy group
  307.  *    p1        number of the first logical disk in the group
  308.  *    p2        second logical disk
  309.  *    ...        more logical disks
  310.  *    END_MARKER    end of the group
  311.  *
  312.  * Each entry is a 16-bit value. This sequence is repeated for each
  313.  * redundancy group, and the list is terminated by two consecutive
  314.  * END_MARKERs.
  315.  *
  316.  * The flags and end markers are defined as:
  317.  */
  318. #define    RGRP_SIZE    2048    /* maximum number of entries in the array */
  319.  
  320. #define    P_REDUNDANCY    0x0001
  321. #define    Q_REDUNDANCY    0x0002    /* not supported in this release */
  322. #define    RG_INITIALIZED    0x0004    /* true (on read) if r.g. is initialized */
  323.  
  324. #define    END_MARKER    0xffff
  325.  
  326. /*
  327.  * The logical volume array is a list of values with the following format:
  328.  * This IOPB uses a buffer of up to 4k in size with the following format:
  329.  *
  330.  *    flags        flags/depth for this logical volume
  331.  *    p1        number of the first logical disk in the volume
  332.  *    p2        second logical disk
  333.  *    ...        more logical disks
  334.  *    END_MARKER    end of the volume
  335.  *
  336.  * Each entry is a 16-bit value. This sequence is repeated for each
  337.  * logical volume, and the list is terminated by two consecutive
  338.  * END_MARKERs.
  339.  *
  340.  * The flags word contains an 8-bit depth value in the lower 8 bits. The
  341.  * upper 8 bits are currently unused and reserved.
  342.  */
  343. #define    VOL_SIZE    2048    /* maximum number of entries in the array */
  344.  
  345.  
  346. /*
  347.  * This structure is used to transfer all information relating to logical
  348.  * disks, redundancy groups, and logical volumes. This allows an entire
  349.  * change of the configuration to made in one atomic operation.
  350.  */
  351. struct disk_config {
  352.     int    num_log_disks;
  353.     struct    logical_disk    log_disks[MAX_LOG_DISKS];
  354.     u_short    volumes[VOL_SIZE];
  355.     u_short    redun_groups[RGRP_SIZE];
  356. };
  357.  
  358.  
  359. /*
  360.  * CMD_READ_STATS
  361.  */
  362.  
  363.  
  364. /*
  365.  * CMD_READ_ELOG
  366.  */
  367.  
  368. /*
  369.  * The time-of-day clock
  370.  */
  371.  
  372. typedef struct {
  373.   unsigned int    year:8;
  374.   unsigned int  month:8;
  375.   unsigned int  day:8;
  376.   unsigned int  hour:8;
  377.   unsigned int    min:8;
  378.   unsigned int  sec:8;
  379.   unsigned int  ticks:16;
  380. } TIME;
  381.  
  382.  
  383. typedef    unsigned long    CRU;
  384.  
  385.  
  386. /*
  387.  * CRU types
  388.  */
  389. #define    CRU_DISK    0
  390. #define    CRU_BATTERY    1
  391. #define    CRU_BULK    2
  392. #define    CRU_DCC        3
  393. #define    CRU_FAN        4
  394. #define    CRU_DENV    5
  395. #define    CRU_PENV    6
  396. #define    CRU_CONTROLLER    7
  397. #define    CRU_IPI        8
  398. #define    CRU_VME        9
  399. #define    CRU_SCSI    10
  400. #define    CRU_POWER_BKPLN    11
  401. #define    CRU_DISK_BKPLN    12
  402. #define    CRU_SCSI_CABLE    13
  403.  
  404. #define    CRU_NONE    100
  405.  
  406.  
  407. #define MK_CRU(type, bp, major_id, minor_id) \
  408.     (((type) << 24) | ((bp) << 16) | ((major_id) << 8) | (minor_id))
  409.  
  410. /*
  411.  * The following macro is used when no CRU identifier is applicable.
  412.  */
  413. #define    NO_CRU    MK_CRU(CRU_NONE, 0, 0, 0)
  414.  
  415.  
  416. /*
  417.  * Macros to get the pieces of a CRU identifier
  418.  */
  419.  
  420. #define    CRU_TYPE(cru)        (((cru) >> 24) & 0xff)
  421. #define    CRU_CABINET(cru)    (((cru) >> 16) & 0xff)
  422. #define    CRU_MAJOR_ID(cru)    (((cru) >>  8) & 0xff)
  423. #define    CRU_MINOR_ID(cru)    ((cru) & 0xff)
  424.  
  425. typedef struct {
  426.     unsigned long        iopb_status;
  427.     unsigned long        iopb_status2;
  428.     unsigned int        scsi_status:8,
  429.             reserved:24;
  430.     union {
  431.         struct {
  432.             unsigned long    scsi_msg_byte:8,
  433.                 sense_key:8,
  434.                 error:8,
  435.                 :8;
  436.             unsigned long    error_info;
  437.         } extended;
  438.  
  439.         char    request_sense[32];
  440.     } rqst_sense_data;
  441. } STATUS_ENTRY;
  442.  
  443.  
  444. #define    MAXFILENAME    32    /* max. file name length */
  445. #define    MAXTASKNAME    8    /* max. task name length */
  446. #define    MAXTEXTLEN    128    /* maximum size of a text message */
  447. #define    NUMREGS        42    /* number of saved processor registers */
  448.  
  449. typedef enum {
  450.     ED_NONE,            /* indicates the union is empty */
  451.     ED_CDB,
  452.     ED_TEXT,
  453.     ED_STATUS,
  454.     ED_CPU
  455. } EDATA_TYPE;
  456.  
  457. typedef union {
  458.     char        cdb[12];        /* ed_type == ED_CDB */
  459.     STATUS_ENTRY    status;            /* ed_type == ED_STATUS */
  460.     char        text[MAXTEXTLEN];    /* ed_type == ED_TEXT */
  461.     unsigned long        cpu_regs[NUMREGS];    /* ed_type == ED_CPU */
  462.     char        pad[184];
  463. } ERROR_DATA;
  464.  
  465.  
  466. typedef struct {
  467.     /*
  468.      * Information that specifies the type of error
  469.      */
  470.     unsigned long    error_code;
  471.     unsigned long    error_code2;        /* optional, additional information */
  472.  
  473.     CRU        cru;            /* the affected CRU, if any */
  474.  
  475.     /*
  476.      * Information about where the error was reported
  477.      */
  478.     char    file[MAXFILENAME];    /* source code file name */
  479.     unsigned long    line;            /* and line number */
  480.     char    task[MAXTASKNAME];    /* name of the reporting task */
  481.     unsigned long    sw_release;        /* SW release being run */
  482.  
  483.     TIME    time;            /* when the error occurred */
  484.  
  485.     EDATA_TYPE    ed_type;        /* tells what is in the union below */
  486.     ERROR_DATA    error_data;
  487.  
  488. } ERROR_REC;
  489.  
  490. #endif /* _IOPB */
  491.